package structuresManagers;
import java.io.IOException;
import java.util.Iterator;
import mainPackage.DatosUrl;

import register.Register;
import register.RegisterID;
import bplustree.BadChecksumException;
import FilesManagers.CantOpenFileException;
import FilesManagers.FileManager;



import Filters.FullFilter;
public abstract class AbstractManager {
	private DocumentsManager doc;
	protected FullFilter filtro;
	
	public AbstractManager(String urls, String urlsProcesadas,FullFilter filtro) throws CantOpenFileException{
		this.filtro=filtro;
		doc = new DocumentsManager(urls,urlsProcesadas,filtro);
		//this(urls,filtro);
		//urlsProcesedFile =urlsIndexadas;
		
	}
	
	protected abstract void buildStructure(String archivo, Integer structureSize) throws IOException,CantOpenFileException;
	
	protected abstract void inMakeStructure(Register registro) throws IOException, BadChecksumException;
	
	protected abstract void inMakeStructureUrlFinished() throws IOException;
	
	/*Lo uso para continuar con alguna estructura generada anteriormente*/
	public void makeStructure(String file1, Integer structureSize ) throws CantOpenFileException{
		DatosUrl datosUrl;
		//DocumentsManager doc = new DocumentsManager(urls,urlsProcesedFile,filtroLinea);
		doc.organizarUrls();
		try {
			
			this.buildStructure(file1,structureSize);
			Register registro = new Register();
			RegisterID IdRegistro = new RegisterID();
			while((datosUrl = doc.devolverPalabrasSiguiente())!=null){
				Iterator itPalabras = datosUrl.getItPalabras();
				int numeroUrl =	datosUrl.getNumeroUrl();
							
				String palabra="";
				while(itPalabras.hasNext()){
					palabra=itPalabras.next().toString().trim();
					if(!palabra.equals(""))
					{	
						IdRegistro.setID(palabra);
						registro.setID(IdRegistro);
						registro.setAtribute(numeroUrl);
						this.inMakeStructure(registro);
						
					}
				}
				this.inMakeStructureUrlFinished();
							
			}
			doc.finalize();
		}catch (IOException e) {
			// TODO Auto-generated catch block
			//e.printStackTrace();
			throw new CantOpenFileException("No se pudo abrir el archivo de la estructura");
		} catch (BadChecksumException e) {
			// TODO Bloque catch generado automáticamente
			e.printStackTrace();
		}
			
		
		
	}
	/*Lo uso para probar desde cero el indice*/
	public void makeNewStructure(String file1, Integer structureSize) throws CantOpenFileException{
		FileManager.borrar(file1);
		doc.restart(); // Se prepara para un nuevo
		this.makeStructure(file1,structureSize);
		
	}

	protected abstract Register inSearch(String objetivo) throws IOException, BadChecksumException;
	
	public String[] search(String file1,String entrada) throws CantOpenFileException{
		try {
			this.buildStructure(file1,128);//el 128 es dummy, el archivo contiene el Size
			String objetivo=entrada;
//			if (!(this instanceof BruteForceManager)){
//				objetivo=filtro.procesarSearch(entrada);
//			}
			
			Register tempReg = this.inSearch(objetivo);
			if(tempReg==null)
				return null;
			//System.out.println("Registro más proximo encontrado:");
			//System.out.println("Size; ID||At1|At2|At...");
			
			String encontrada=tempReg.getID().getID();
			//if(encontrada!=null && !objetivo.trim().equals("") && !encontrada.equals(objetivo))
				//System.out.print("MAS PROXIMO ");
			return doc.obtenerUrlRegistro(tempReg);
			
		} catch (IOException e) {
			throw new CantOpenFileException("No se pudo abrir el archivo del indice");
		}catch (BadChecksumException e) {
			//Desprecated exception			
			//e.printStackTrace();
		}
		return null;
		
		
	}
		
	public String[] listAll(String file1) throws CantOpenFileException{
		return doc.getUrlList();
			
	}

	

}
